package com.huihe.common.utils;

import com.huihe.common.entity.ITreeNode;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * 将实现了ITreeNode接口的对象集合转为树形的工具类
 */
public class TreeUtils {

    /**
     * 生成树
     * @param list 要生成树的数据
     * @param systemCode 父节点的ID
     * @return 已经生成树的List
     * @param <T> 实现了ITreeNode的Vo类
     */
    public static <T extends ITreeNode<T>> List<T> assemblyTree(List<T> list, String systemCode) {
        List<T> rootNodes = new ArrayList<>();
        Map<String, T> nodeMap = new HashMap<>();
        Iterator<T> iteratorList = list.iterator();

        T root;
        //读取参数List,并存入map中
        while(iteratorList.hasNext()) {
            root = iteratorList.next();
            nodeMap.put(root.getId(),root);
        }

        for (Map.Entry<String, T> treeNodeEntry : nodeMap.entrySet()) {
            T node = treeNodeEntry.getValue();
            T parentNode = nodeMap.get(node.getParentId());
            //验证当前查询最高节点是一级节点
            if (node.getId().equals(systemCode)) {
                //插入最高节点
                rootNodes.add(node);
            } else {
                //创建List
                if (CollectionUtils.isEmpty(parentNode.getChildren())) {
                    List<T> ch = new ArrayList<>();
                    parentNode.setChildren(ch);
                }
                //插入子节点
                parentNode.getChildren().add(node);
            }
        }

        for (T rootNode : rootNodes) {
            travelTreeAndSortChild(rootNode);
        }
        return rootNodes;
    }

    /**
     * 对孩子节点进行排序
     * @param root 父节点
     */
    private static <T extends ITreeNode<T>> void travelTreeAndSortChild(T root) {
        if (root != null) {
            List<T> children = root.getChildren();
            //子节点非空
            if (!CollectionUtils.isEmpty(children)) {
                //List排序
                children.sort(Comparator.comparingInt(ITreeNode::getOrders));
                for (T child : children) {
                    //递归调用
                    travelTreeAndSortChild(child);
                }
            }
        }
    }
}
